#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <math.h>
#include "../lib/igloo/igloo.h"
#include "../../Encriptacion/NumerosPrimos.h"



using namespace igloo;
using namespace std;
using namespace Encriptacion;

Context(NumerosPrimosTest) {

	NumerosPrimos* numeroPrimo;
	int cantidadLineasArchivo;

	void SetUp() {
		this->numeroPrimo = new NumerosPrimos();
		cantidadLineasArchivo = 9591;
	}

	void TearDown() {
		delete this->numeroPrimo;
	}

	Spec(random) {
		srand(time(NULL));
		int random = rand() % cantidadLineasArchivo;
		string num1 = numeroPrimo->leerLinea(random*7);

		random = rand() % cantidadLineasArchivo;
		string num2 = numeroPrimo->leerLinea(random*7);

		Assert::That(num1 != num2);
	}

	Spec(seek){
		string cero = numeroPrimo->leerLinea(0);
		string siete = numeroPrimo->leerLinea(7);
		string veintiocho = numeroPrimo->leerLinea(28);
		string max = numeroPrimo->leerLinea(67137);

		Assert::That(cero, Is().EqualTo("00002"));
		Assert::That(siete, Is().EqualTo("00003"));
		Assert::That(veintiocho, Is().EqualTo("00011"));
		Assert::That(max, Is().EqualTo("99991"));
	}

	Spec(charANum){
		string numeroPrimoChar = numeroPrimo->leerLinea(0);
		unsigned long long nPLong = atoll(numeroPrimoChar.c_str());
		Assert::That(nPLong, Is().EqualTo(2));

		numeroPrimoChar = numeroPrimo->leerLinea(67137);
		nPLong = atoll(numeroPrimoChar.c_str());
		Assert::That(nPLong, Is().EqualTo(99991));

		numeroPrimoChar = numeroPrimo->leerLinea(840);
		nPLong = atoll(numeroPrimoChar.c_str());
		Assert::That(nPLong, Is().EqualTo(661));
	}

	Spec(parNumeros){
		unsigned long long n = 2060988401;
		vector<unsigned long long >* vec = new vector<unsigned long long>;
		unsigned long long i;
		int pos = 0;
		if(n!=1){
			i = numeroPrimo->leerNumero(pos);
			while(i< n+1 && n !=1){
				if((n % i) == 0){
					vec->push_back(i);
					n = n/i;
				}else{
					pos +=7;
					i = numeroPrimo->leerNumero(pos);
				}
			}
		}
		for(unsigned int j=0;j< vec->size();j++){
			cout<<vec->at(j)<<endl;
		}

		delete vec;

	}

	Spec(getParNP){
		unsigned long long p,q,m;
		m = 4;
		numeroPrimo->getParNumerosPrimos(p,q,m);

	}
};
